pcap 예제
NOTE
pcap 개발환경 설치/컴파일 방법과 Ethernet/IP/TCP 헤더 구조, 바이트 오더 변환 함수(htons/htonl/ntohs/ntohl) 정리.
⚙️ 구현
관련 노트:
pcap 설치
apt install libpcap.devpcap 실행
# 컴파일
gcc -o 저장할이름 c언어파일.c -lpcap
# 실행
./저장된이름헤더 정보
Ethernet이란? 물리계층에서는 신호와 배선, 데이터링크 계층에서 MAC 패킷과 프로토콜 형식을 정의. 헤더 구조:
- Dest MAC (6byte)
- Source MAC (6byte)
- TYPE (2byte): 상위 계층 프로토콜 종류 구분
IP란? 컴퓨터 주소. 헤더 구조:
- Version: 4bit, IP 버전
- Header Length: 4bit, 헤더 길이 값
- Type-of-Service-Flags: 서비스의 우선순위 제공
- Total Packet Length: 2byte, IP~패킷 끝까지 총 길이
- Fragment identifier: 2byte, 데이터 식별을 위한 것
- Fragment Flags: 3bits
- x: 항상 0으로 설정
- D: 분열 여부 (0: 분열 가능 / 1: 분열 방지)
- M: 분열된 조각이 더 있는지 판단 (0: 마지막 조각 / 1: 조각 더 있음)
- Fragment Offset: 13bits, 원래 데이터의 바이트 범위를 나타냄
- Time-to-live: 1byte, 데이터를 전달할 수 있는 단계의 수 (소멸되기 전까지)
- Protocol Identifier: 1byte, 상위계층 프로토콜 표시 (TCP: 6 / UDP: 17)
- Header Checksum: 2byte, IP 헤더의 체크섬 저장
- Source IP Address: 4byte, 출발지 IP 주소
- Destination IP Address: 4byte, 목적지 IP 주소
TCP란? 데이터를 분할하여 보냄 (IP 이용). 헤더 정보:
- Source Port: 2byte, 데이터 전송 포트
- Dest Port: 2byte, 목적지 포트
- Sequence Number: 4byte, 데이터 일련번호 (쪼개져서 들어와도 이 순서에 맞춰서 재조립)
- Acknowledgement Number: 4byte, 수신 준비 및 수신 완료 확인 메세지 전달
- Header Length: 4byte, 필드값 × 4 = TCP 헤더 길이 값
- Reserved: 6bit, 차후 사용을 위한 예약 필드
- Control Flags (6bit)
- C: 혼잡 윈도우 크기 감소
- E: 혼잡 알림
- U: 세그먼트 번호까지 긴급데이터를 포함한다는 것을 알림 (0이라면 무시)
- A: 확인 응답 메세지
- P: 데이터를 포함한다는 것을 알림
- R: 수신거부
- S: 확인 메세지 전송
- F: 연결 종료 요청
- window size: 2byte, 보낼 수 있는 버퍼 크기를 바이트 단위로 나타냄
- CheckSum: 2byte, TCP 세그먼트 유효 및 손상 여부 검사
IP 변환 (hex값 표현 → little endian VS big endian 방식)
- host to network
htons(): short int (2byte) → 네트워크 바이트로 변환htonl(): long int (4byte) → 네트워크 바이트로 변환
- network to host
ntohl(): long int 데이터 → host byte로 변환ntohs(): short int 데이터 → host byte로 변경
inet_addr()↔inet_ntoa()inet_ntoa(): IP(바이트)값을 10진수로 표현- 예)
192.157.xxx.xxx